Finish magellan nav companion. From Ron Parker.
authorrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 17 Oct 2002 06:26:52 +0000 (06:26 +0000)
committerrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 17 Oct 2002 06:26:52 +0000 (06:26 +0000)
gpsbabel/defs.h
gpsbabel/magnav.c
gpsbabel/util.c
gpsbabel/vecs.c

index 7c8484d998847e47dc5323e6d42c652a6c31020c..88271b8afde9ed5dde6bf505ad3280f98d935b14 100644 (file)
@@ -141,6 +141,14 @@ void *xcalloc(size_t nmemb, size_t size);
 void *xmalloc(size_t size);
 char * xstrdup(const char *s);
 
+
+/*
+ * PalmOS records like fixed-point numbers, which should be rounded
+ * to deal with possible floating-point representation errors.
+ */
+
+signed int round( double d );
+
 /* 
  * Data types for Palm/OS files.
  */
index 39c57e9e3d3864a542c428d362ec9b29e808fbbb..3e0c5c059387c69d3dc434efac75fde710d8cfe3 100644 (file)
@@ -46,6 +46,7 @@ struct record {
        pdb_32 longitude; /* lon * 1e5 */
        pdb_32 elevation; /* meters */
        char plot; /* 1 = plot on map screen.   default = 0 */
+       char unknown3; /* always 'a' */
 };
 
 static FILE *file_in;
@@ -141,36 +142,66 @@ my_writewpt(waypoint *wpt)
        struct record *rec;
        static int ct;
        struct tm *tm;
-abort();
-       rec = xcalloc(sizeof(*rec),1);
-#if 0
-       strncpy(rec->ID, wpt->shortname, sizeof(rec->ID));
-       rec->ID[sizeof(rec->ID)-1] = 0;
-       strncpy(rec->name, wpt->description, sizeof(rec->name));
-       rec->name[sizeof(rec->name)-1] = 0;
-
-       if (wpt->creation_time) {
-               tm = gmtime(&wpt->creation_time);
-               rec->min = tm->tm_min;
-               rec->hour = tm->tm_hour;
-               rec->sec = tm->tm_sec;
-               rec->day = tm->tm_mday;
-               rec->mon = tm->tm_mon + 1;
-               rec->year = tm->tm_year - 100;
-       } else {
-               rec->min = 0xff;
-               rec->hour = 0xff;
-               rec->sec = 0xff;
-               rec->day = 0xff;
-               rec->mon = 0xff;
-               rec->year = 0xff;
+       char *vdata;
+       time_t tm_t;
+       
+       rec = xcalloc(sizeof(*rec)+56,1);
+       
+       if ( wpt->creation_time ) {
+               tm = gmtime( &wpt->creation_time);
        }
-
-       be_write32(&rec->longitude, wpt->position.longitude.degrees * 10000000.0);
-       be_write32(&rec->latitude, wpt->position.latitude.degrees * 10000000.0);
-       be_write32(&rec->elevation, wpt->position.altitude.altitude_meters * 100.0);
-
-       opdb_rec = new_Record (0, 0, ct++, sizeof(*rec), (const ubyte *)rec);
+       else {
+               time( &tm_t );
+               tm = gmtime( &tm_t );
+       }
+       
+       be_write16( &rec->crt_sec, tm->tm_sec );
+       be_write16( &rec->crt_min, tm->tm_min );
+       be_write16( &rec->crt_hour, tm->tm_hour );
+       be_write16( &rec->crt_mday, tm->tm_mday );
+       be_write16( &rec->crt_mon, tm->tm_mon + 1 );
+       be_write16( &rec->crt_year, tm->tm_mon + 1900 );
+       
+        be_write16( &rec->unknown, 0);
+       
+       be_write16( &rec->xx_sec, tm->tm_sec );
+       be_write16( &rec->xx_min, tm->tm_min );
+       be_write16( &rec->xx_hour, tm->tm_hour );
+       be_write16( &rec->xx_mday, tm->tm_mday );
+       be_write16( &rec->xx_mon, tm->tm_mon + 1 );
+       be_write16( &rec->xx_year, tm->tm_mon + 1900 );
+       
+        be_write16( &rec->unknown2, 0);
+       
+       be_write32(&rec->longitude, round(wpt->position.longitude.degrees * 100000.0));
+       be_write32(&rec->latitude, round(wpt->position.latitude.degrees * 100000.0));
+       be_write32(&rec->elevation, wpt->position.altitude.altitude_meters);
+
+       rec->plot = 0;
+       rec->unknown3 = 'a';
+       
+       vdata = (char *)rec + sizeof(*rec);
+       if ( wpt->shortname ) {
+               strncpy( vdata, wpt->shortname, 21 );
+               vdata[20] = '\0';
+       }
+       else { 
+               vdata[0] ='\0';
+       }
+       vdata += strlen( vdata ) + 1;
+       if ( wpt->description ) {
+               strncpy( vdata, wpt->description, 33 );
+               vdata[32] = '\0';
+       }
+       else {
+               vdata[0] = '\0';
+       }
+       vdata += strlen( vdata ) + 1;
+       vdata[0] = '\0';
+       vdata[1] = '\0';
+       vdata += 2;
+       
+       opdb_rec = new_Record (0, 0, ct++, vdata-(char *)rec, (const ubyte *)rec);
 
        if (opdb_rec == NULL) {
                fatal(MYNAME ": libpdb couldn't create record");
@@ -179,35 +210,53 @@ abort();
        if (pdb_AppendRecord(opdb, opdb_rec)) {
                fatal(MYNAME ": libpdb couldn't append record");
        }
-#endif
 }
 
-struct hdr{
-       char *wpt_name; 
-       waypoint *wpt;
-};
-
 static void
 data_write(void)
 {
-       int ct = waypt_count();
-       struct hdr *htable;
-        queue *elem, *tmp;
-
+        extern queue waypt_head;
+       queue *elem, *tmp;
+
+       static char *appinfo = 
+               "\0\x01"
+               "User\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+               "\0\x01\x02\x03\x04\x05\x06\x07\x08"
+               "\x09\x0a\x0b\x0c\x0d\x0e\x0f\0\0";
+       
        if (NULL == (opdb = new_pdb())) { 
                fatal (MYNAME ": new_pdb failed\n");
        }
 
-       strncpy(opdb->name, out_fname, PDB_DBNAMELEN);
+       strncpy(opdb->name, "Companion Waypoints", PDB_DBNAMELEN);
        opdb->name[PDB_DBNAMELEN-1] = 0;
        opdb->attributes = PDB_ATTR_BACKUP;
        opdb->ctime = opdb->mtime = time(NULL) + 2082844800U;
        opdb->type = MYTYPE;  /* CWpt */
        opdb->creator = MYCREATOR; /* cGPS */
-       opdb->version = 0;
-
+       opdb->version = 1;
+       opdb->appinfo = (void *)appinfo;
+       opdb->appinfo_len = 276;
+        QUEUE_FOR_EACH(&waypt_head, elem, tmp) {
+               my_writewpt((waypoint *)elem);
+       }
+       
        pdb_Write(opdb, fileno(file_out));
-       free(htable);
 }
 
 
index 999f899c020f104d5bc126d46007be8f66ef7a63..e5f4f36828564a181977636ec9f12b89011d2b20 100644 (file)
@@ -117,6 +117,15 @@ be_read16(void *p)
        return i[0] << 8 | i[0];
 }
 
+void
+be_write16(void *addr, unsigned value)
+{
+       unsigned char *p = addr;
+       p[0] = value >> 8;
+       p[1] = value;
+       
+}
+
 void
 be_write32(void *pp, unsigned i)
 {
@@ -161,3 +170,13 @@ le_write32(void *addr, unsigned value)
        p[3] = value >> 24;
 }
 
+signed int 
+round( double d )
+{
+       if ( d < 0 ) {
+               return (signed int)(d-0.5);
+       }
+       else {
+               return (signed int)(d+0.5);
+       }
+}
index 2735bc5a507f41460a3e18de59d6fb1d77a9f6b4..6f29e98de9d16063e191d782c55d4a9a493fb312 100644 (file)
@@ -47,6 +47,7 @@ extern ff_vecs_t holux_vecs;
 extern ff_vecs_t ozi_vecs;
 extern ff_vecs_t tpg_vecs;
 extern ff_vecs_t dna_vecs;
+extern ff_vecs_t magnav_vec;
 extern ff_vecs_t xmap_vecs;
 
 static
@@ -124,6 +125,11 @@ vecs_t vec_list[] = {
        {
                &gpspilot_vecs,
                "gpspilot",
+       },
+       {
+               &magnav_vec,
+               "magnav",
+               "Magellan NAV Companion for PalmOS"
                "GPSPilot Tracker for Palm/OS"
        },
        {